home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 45
/
Aminet 45 (2001)(GTI - Schatztruhe)[!][Oct 2001].iso
/
Aminet
/
gfx
/
x11
/
x3270_3_2_16.lha
/
amiga_src
/
charset.c
< prev
next >
Wrap
C/C++ Source or Header
|
2009-02-22
|
4KB
|
166 lines
/*
* Modifications Copyright 1993, 1994, 1995, 1996, 1999, 2000 by Paul Mattes.
* Original X11 Port Copyright 1990 by Jeff Sparkes.
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appear in all copies and that
* both that copyright notice and this permission notice appear in
* supporting documentation.
*
* Copyright 1989 by Georgia Tech Research Corporation, Atlanta, GA 30332.
* All Rights Reserved. GTRC hereby grants public use of this software.
* Derivative works based on this software must incorporate this copyright
* notice.
*/
/*
* charset.c
* This module handles character sets.
*/
#include "globals.h"
#include "resources.h"
#include "appres.h"
#include "cg.h"
#include "charsetc.h"
#include "kybdc.h"
#include "tablesc.h"
#include "utilc.h"
/* Globals. */
Boolean charset_changed = False;
/* Statics. */
static void remap_chars(char *spec);
/*
* Change character sets.
* Returns True if the new character set was found, False otherwise.
*/
Boolean
charset_init(char *csname)
{
char *resname;
char *cs;
if (csname == CN)
return True;
/* Find the character set definition. */
resname = xs_buffer("%s.%s", ResCharset, csname);
cs = get_resource(resname);
Free(resname);
if (cs == CN)
return False;
if (appres.charset == CN || strcmp(csname, appres.charset)) {
appres.charset = NewString(csname);
charset_changed = True;
}
/* Set up the translation tables. */
(void) memcpy((char *)ebc2cg, (char *)ebc2cg0, 256);
(void) memcpy((char *)cg2ebc, (char *)cg2ebc0, 256);
#if defined(X3270_FT) /*[*/
(void) memcpy((char *)ft2asc, (char *)ft2asc0, 256);
(void) memcpy((char *)asc2ft, (char *)asc2ft0, 256);
#endif /*]*/
clear_xks();
remap_chars(NewString(cs));
return True;
}
/*
* Map a keysym name or literal string into a character.
* Returns NoSymbol if there is a problem.
*/
static KeySym
parse_keysym(char *s, Boolean extended)
{
KeySym k;
k = StringToKeysym(s);
if (k == NoSymbol) {
if (strlen(s) == 1)
k = *s & 0xff;
else
return NoSymbol;
}
if (k < ' ' || (!extended && k > 0xff))
return NoSymbol;
else
return k;
}
/*
* Parse an EBCDIC character set map, a series of pairs of numeric EBCDIC codes
* and keysyms.
*
* If the keysym is in the range 1..255, it is a remapping of the EBCDIC code
* for a standard Latin-1 graphic, and the CG-to-EBCDIC map will be modified
* to match.
*
* Otherwise (keysym > 255), it is a definition for the EBCDIC code to use for
* a multibyte keysym. This is intended for 8-bit fonts that with special
* characters that replace certain standard Latin-1 graphics. The keysym
* will be entered into the extended keysym translation table.
*/
static void
remap_chars(char *spec)
{
char *s;
char *ebcs, *isos;
unsigned char ebc, cg;
KeySym iso;
int ne = 0;
int ns;
/* Pick apart a copy of the spec. */
s = spec = NewString(spec);
while ((ns = split_dresource(&s, &ebcs, &isos))) {
ne++;
if (ns < 0 ||
!(ebc = strtol(ebcs, (char **)NULL, 0)) ||
(iso = parse_keysym(isos, True)) == NoSymbol) {
char nbuf[16];
(void) sprintf(nbuf, "%d", ne);
xs_warning("Cannot parse %s \"%s\", entry %s",
ResCharset, appres.charset, nbuf);
break;
}
if (iso <= 0xff) {
#if defined(X3270_FT) /*[*/
unsigned char aa;
#endif /*]*/
cg = asc2cg[iso];
if (cg2asc[cg] == iso) { /* well-defined */
ebc2cg[ebc] = cg;
cg2ebc[cg] = ebc;
} else { /* into a hole */
ebc2cg[ebc] = CG_boxsolid;
}
#if defined(X3270_FT) /*[*/
/*
* Change the file transfer translation table as well.
* This works properly with the US-English character
* set and the bracket character set (which are the
* same, as far as the host is concerned), but has not
* yet been tried out with hosts that genuinely think
* they are using a non-English character set.
*/
aa = asc2ft[ebc2asc[ebc]];
ft2asc[aa] = iso;
asc2ft[iso] = aa;
#endif /*]*/
} else {
add_xk(iso, (KeySym)cg2asc[ebc2cg[ebc]]);
}
}
Free(spec);
}